
package org.redisson.api;

import org.redisson.api.redisnode.BaseRedisNodes;
import org.redisson.api.redisnode.RedisNodes;
import org.redisson.client.codec.Codec;
import org.redisson.codec.JsonCodec;
import org.redisson.config.Config;

import java.util.concurrent.TimeUnit;

/**
 * RedissonClient接口定义了与Redisson客户端交互的方法。
 * Redisson是一个基于Redis客户端的Java框架，提供了丰富的数据结构服务，
 * 包括锁、队列、发布订阅等，旨在简化Redis在Java应用中的使用。
 */
public interface RedissonClient {


    /**
     * 获取指定名称的时间序列。
     */
    <V, L> RTimeSeries<V, L> getTimeSeries(String name);

    <V, L> RTimeSeries<V, L> getTimeSeries(String name, Codec codec);



    /**
     * 根据给定的名称获取一个流。
     */
    <K, V> RStream<K, V> getStream(String name);

    <K, V> RStream<K, V> getStream(String name, Codec codec);



    /**
     * 获取搜索实例。
     */
    RSearch getSearch();

    RSearch getSearch(Codec codec);



    /**
     * 分布式限流
     */
    RRateLimiter getRateLimiter(String name);

    RBinaryStream getBinaryStream(String name);



    /**
     * 分布式 geo地理信息
     */
    <V> RGeo<V> getGeo(String name);

    <V> RGeo<V> getGeo(String name, Codec codec);



    /**
     * 分布式缓存 set
     */
    <V> RSetCache<V> getSetCache(String name);

    <V> RSetCache<V> getSetCache(String name, Codec codec);



    /**
     * 分布式缓存 Map
     */
    <K, V> RMapCache<K, V> getMapCache(String name, Codec codec);

    <K, V> RMapCache<K, V> getMapCache(String name, Codec codec, MapCacheOptions<K, V> options);

    <K, V> RMapCache<K, V> getMapCache(String name);

    <K, V> RMapCache<K, V> getMapCache(String name, MapCacheOptions<K, V> options);



    /**
     * 分布式 bucket
     */
    <V> RBucket<V> getBucket(String name);

    <V> RBucket<V> getBucket(String name, Codec codec);

    RBuckets getBuckets();

    RBuckets getBuckets(Codec codec);

    <V> RJsonBucket<V> getJsonBucket(String name, JsonCodec<V> codec);



    /**
     * 分布式 HyperLogLog
     */
    <V> RHyperLogLog<V> getHyperLogLog(String name);

    <V> RHyperLogLog<V> getHyperLogLog(String name, Codec codec);



    /**
     * 分布式 List
     */
    <V> RList<V> getList(String name);

    <V> RList<V> getList(String name, Codec codec);


    /**
     * 列表（List）和多值映射（Multimap）的概念
     */
    <K, V> RListMultimap<K, V> getListMultimap(String name);

    <K, V> RListMultimap<K, V> getListMultimap(String name, Codec codec);

    <K, V> RListMultimapCache<K, V> getListMultimapCache(String name);
    
    <K, V> RListMultimapCache<K, V> getListMultimapCache(String name, Codec codec);
    



    <K, V> RLocalCachedMap<K, V> getLocalCachedMap(String name, LocalCachedMapOptions<K, V> options);
    
    <K, V> RLocalCachedMap<K, V> getLocalCachedMap(String name, Codec codec, LocalCachedMapOptions<K, V> options);


    /**
     * 分布式 Map
     */
    <K, V> RMap<K, V> getMap(String name);

    <K, V> RMap<K, V> getMap(String name, MapOptions<K, V> options);

    <K, V> RMap<K, V> getMap(String name, Codec codec);

    <K, V> RMap<K, V> getMap(String name, Codec codec, MapOptions<K, V> options);




    /**
     * 列表（Set）和多值映射（Multimap）的概念
     */
    <K, V> RSetMultimap<K, V> getSetMultimap(String name);

    <K, V> RSetMultimap<K, V> getSetMultimap(String name, Codec codec);

    <K, V> RSetMultimapCache<K, V> getSetMultimapCache(String name);

    <K, V> RSetMultimapCache<K, V> getSetMultimapCache(String name, Codec codec);


    /**
     * 分布式 信号量
     */
    RSemaphore getSemaphore(String name);
    


    RPermitExpirableSemaphore getPermitExpirableSemaphore(String name);


    // 分布式锁

    /**
     * 重入锁
     */
    RLock getLock(String name);

    /**
     * token锁
     */
    RFencedLock getFencedLock(String name);

    /**
     * 自旋锁
     */
    RLock getSpinLock(String name);

    RLock getSpinLock(String name, LockOptions.BackOff backOff);

    /*
     * 红锁
     */
    @Deprecated
    RLock getRedLock(RLock... locks);

    /**
     * 联锁
     */
    RLock getMultiLock(RLock... locks);

    /**
     * 公平锁
     */
    RLock getFairLock(String name);

    /**
     * 读写锁
     */
    RReadWriteLock getReadWriteLock(String name);




    // 分布式Set

    <V> RSet<V> getSet(String name);

    <V> RSet<V> getSet(String name, Codec codec);

    <V> RSortedSet<V> getSortedSet(String name);

    <V> RSortedSet<V> getSortedSet(String name, Codec codec);

    <V> RScoredSortedSet<V> getScoredSortedSet(String name);

    <V> RScoredSortedSet<V> getScoredSortedSet(String name, Codec codec);

    RLexSortedSet getLexSortedSet(String name);




    RShardedTopic getShardedTopic(String name);

    RShardedTopic getShardedTopic(String name, Codec codec);




    RTopic getTopic(String name);

    RTopic getTopic(String name, Codec codec);




    RReliableTopic getReliableTopic(String name);

    RReliableTopic getReliableTopic(String name, Codec codec);




    RPatternTopic getPatternTopic(String pattern);

    RPatternTopic getPatternTopic(String pattern, Codec codec);





    <V> RQueue<V> getQueue(String name);

    <V> RQueue<V> getQueue(String name, Codec codec);




    <V> RTransferQueue<V> getTransferQueue(String name);

    <V> RTransferQueue<V> getTransferQueue(String name, Codec codec);


    <V> RDelayedQueue<V> getDelayedQueue(RQueue<V> destinationQueue);




    <V> RRingBuffer<V> getRingBuffer(String name);
    
    <V> RRingBuffer<V> getRingBuffer(String name, Codec codec);



    <V> RPriorityQueue<V> getPriorityQueue(String name);

    <V> RPriorityQueue<V> getPriorityQueue(String name, Codec codec);



    <V> RPriorityBlockingQueue<V> getPriorityBlockingQueue(String name);

    <V> RPriorityBlockingQueue<V> getPriorityBlockingQueue(String name, Codec codec);




    <V> RPriorityBlockingDeque<V> getPriorityBlockingDeque(String name);

    <V> RPriorityBlockingDeque<V> getPriorityBlockingDeque(String name, Codec codec);
    



    <V> RPriorityDeque<V> getPriorityDeque(String name);
    
    <V> RPriorityDeque<V> getPriorityDeque(String name, Codec codec);
    



    <V> RBlockingQueue<V> getBlockingQueue(String name);

    <V> RBlockingQueue<V> getBlockingQueue(String name, Codec codec);

    <V> RBlockingDeque<V> getBlockingDeque(String name);

    <V> RBlockingDeque<V> getBlockingDeque(String name, Codec codec);




    <V> RBoundedBlockingQueue<V> getBoundedBlockingQueue(String name);

    <V> RBoundedBlockingQueue<V> getBoundedBlockingQueue(String name, Codec codec);




    <V> RDeque<V> getDeque(String name);

    <V> RDeque<V> getDeque(String name, Codec codec);




    RAtomicLong getAtomicLong(String name);

    RAtomicDouble getAtomicDouble(String name);



    RLongAdder getLongAdder(String name);

    RDoubleAdder getDoubleAdder(String name);
    

    RCountDownLatch getCountDownLatch(String name);




    RBitSet getBitSet(String name);




    <V> RBloomFilter<V> getBloomFilter(String name);

    <V> RBloomFilter<V> getBloomFilter(String name, Codec codec);




    RIdGenerator getIdGenerator(String name);


    RFunction getFunction();


    RFunction getFunction(Codec codec);


    RScript getScript();
    

    RScript getScript(Codec codec);


    RScheduledExecutorService getExecutorService(String name);


    RScheduledExecutorService getExecutorService(String name, ExecutorOptions options);


    RScheduledExecutorService getExecutorService(String name, Codec codec);


    RScheduledExecutorService getExecutorService(String name, Codec codec, ExecutorOptions options);
    

    RRemoteService getRemoteService();
    

    RRemoteService getRemoteService(Codec codec);


    RRemoteService getRemoteService(String name);
    

    RRemoteService getRemoteService(String name, Codec codec);


    RTransaction createTransaction(TransactionOptions options);


    /**
     * 创建一个批处理实例。
     * 批处理用于管理一组批处理操作，这些操作可以被计划、执行和监控。通过批处理，可以高效地处理大量数据，
     * 提供可重复的、自动化的过程，以满足业务需求。
     * @return RBatch 返回一个批处理实例，该实例可用于添加批处理步骤和配置批处理属性。
     */
    RBatch createBatch();

    RBatch createBatch(BatchOptions options);










    RKeys getKeys();


    RLiveObjectService getLiveObjectService();


    RedissonRxClient rxJava();


    RedissonReactiveClient reactive();


    void shutdown();
    

    void shutdown(long quietPeriod, long timeout, TimeUnit unit);


    Config getConfig();


    <T extends BaseRedisNodes> T getRedisNodes(RedisNodes<T> nodes);

    boolean isShutdown();

    boolean isShuttingDown();


    /**
     * 获取ID的方法。
     * @return 返回一个表示唯一标识符的字符串。
     */
    String getId();

    @Deprecated
    NodesGroup<Node> getNodesGroup();

    @Deprecated
    ClusterNodesGroup getClusterNodesGroup();


}
